Настроим docker-compose файл, в котором в качестве сервисов будет: postgres и server. Настроим постоянное хранение, сетевое окружение и healthckecks. Для server настроим Dockerfile с необходимой версией питона (облегченной) и необходимыми библиотеками. В app.py находится логика приложения: при помощи Flask будет подниматься сервер, из postgres будем получать ФИО, формировать HTML страницу для возврата.
Сделаем сборку server
С помощью команды docker-compose up -d развернем сервисы. В браузере по адресу localhost:8080 увидим результат
Установим trivy.
Запустим сканирование. В начале произойдет загрузка БД с уязвимостями. Далее появятся найденные уязвимости.
Результат сканирования:
server:latest (alpine 3.18.6)
В библиотеке libexpat (свободная потокоориентированная библиотека парсинга XML) будет найдено две уязвимости:
-
CVE-2023-52425 - Неконтроллируемое потребление ресурсов - Продукт не контролирует должным образом распределение и обслуживание ограниченного ресурса, тем самым позволяя субъекту влиять на количество потребляемых ресурсов, что в конечном итоге приводит к исчерпанию доступных ресурсов. Решение: уязвимость существует до версии 2.5.0, необходимо использовать библиотеку, начиная с версии 2.6.0 (написать Dockerfile, где прописать обновление)
-
CVE-2023-52426 - Неправильное ограничение рекурсивных ссылок на сущности в DTD (XML Entity Expansion) - Продукт использует XML-документы и позволяет определять их структуру с помощью определения типа документа (DTD), но не контролирует должным образом количество рекурсивных определений сущностей. Решение: уязвимость существует до версии 2.5.0, необходимо использовать библиотеку, начиная с версии 2.6.0 (написать Dockerfile, где прописать обновление)
Python (python-pkg)
В библиотеке pip (METADATA) найдена одна уязвимость:
- CVE-2023-5752 - При установке пакета по URL-адресу Mercurial VCS (т. е. «pip install hg+...») с помощью pip до версии v23.3 указанная версия Mercurial может использоваться для внедрения произвольных параметров конфигурации в вызов «hg clone» (т. е. « --конфигурация"). Управление конфигурацией Mercurial может изменить способ и тип установки репозитория. Эта уязвимость не затрагивает пользователей, которые выполняют установку не из Mercurial.
Решение: уязвимость существует до версии 23.3, необходимо использовать библиотеку, начиная с версии 23.3. (написать Dockerfile, где прописать обновление)
В отдельную папку склонируем репозиторий утилиты bench-security
Запустим ее.
Получим счет:
В результате работы программы видим следующие предупреждения:
1.1.1 - Ensure a separate partition for containers has been created (Automated) - "Убедитесь, что отдельное разделение для контейнеров было создано (Автоматизировано)."
Степень риска: Это предупреждение связано с безопасностью и изоляцией контейнеров. Отсутствие отдельного разделения может увеличить вероятность воздействия компрометированного контейнера на другие системы или контейнеры.
Как исправить:
- Настройка отдельного разделения: Создайте отдельный раздел для контейнеров, чтобы изолировать их работу от других систем. Это поможет предотвратить распространение проблем между контейнерами.
- Использование инструментов управления: Воспользуйтесь инструментами управления контейнерами, которые позволяют настроить изоляцию и безопасность контейнеров, такими как Docker Compose или Kubernetes.
1.1.3 - Ensure auditing is configured for the Docker daemon (Automated) - "Убедитесь, что настроен аудит для демона Docker (Автоматизировано)."
Степень риска: Отсутствие настроенного аудита для демона Docker может привести к неспособности отслеживать события, связанные с операциями Docker, что создает слепые пятна в безопасности и возможность упущения аномалий или атак.
Как исправить:
- Настройка журналирования: Настройте аудит для демона Docker, чтобы записывать события, связанные с его работой. Это включает операции, авторизации, аутентификацию и другие важные действия.
- Анализ и мониторинг: Организуйте мониторинг и анализ журналов аудита Docker, чтобы быстро обнаруживать подозрительную активность или нарушения безопасности.
1.1.4 - Ensure auditing is configured for Docker files and directories -/run/containerd (Automated) - "Убедитесь, что настроен аудит для файлов и каталогов Docker - /run/containerd (Автоматизировано)."
Степень риска: Не настроенный аудит для файлов и каталогов Docker, таких как /run/containerd, означает, что возможны незамеченные изменения, атаки на файловую систему или несанкционированный доступ к системным ресурсам.
Как исправить:
- Настройка аудита: Настройте аудит для файлов и каталогов, связанных с Docker, чтобы учитывать изменения, доступ и другие операции.
- Мониторинг и анализ: Установите мониторинг на файловые системы Docker для выявления подозрительной активности или нарушений безопасности.
2.2 - Ensure network traffic is restricted between containers on the default bridge (Scored) - "Убедитесь, что сетевой трафик ограничен между контейнерами на стандартном мосту (Оценено)."
Степень риска: Ограничение сетевого трафика между контейнерами на стандартном мосту крайне важно для предотвращения несанкционированного доступа и распространения возможных угроз внутри контейнерной среды. Отсутствие такого ограничения может привести к уязвимостям в безопасности и утечкам данных между контейнерами.
Как исправить:
- Сетевые политики: Настройте правила сетевого доступа и политики в вашей контейнерной среде для блокировки нежелательного трафика между контейнерами.
- Использование сетевых абстракций: Рассмотрите использование сетевых абстракций и инструментов, таких как Docker network plugins или Kubernetes network policies, для более гранулированного управления сетевым трафиком между контейнерами.
2.9 - Enable user namespace support (Scored) - "Включите поддержку пространств имен пользователей (Оценено)."
Степень риска: Отсутствие поддержки пространств имен пользователей (user namespace) может повысить риск компрометации безопасности контейнеров, так как это позволяет более гранулированно управлять разрешениями и доступом пользователей внутри контейнеров. Без этой функциональности атакующий может иметь повышенные привилегии в случае успешной атаки.
Как исправить:
- Включение поддержки: Активируйте поддержку пространств имен пользователей в конфигурации Docker или другой контейнерной платформы.
- Конфигурация пространств имен: Настройте подходящие параметры и политики для использования пространств имен пользователей в соответствии с требованиями вашей безопасности.
2.12 - Ensure that authorization for Docker client commands is enabled (Scored) - "Убедитесь, что авторизация для команд клиента Docker включена (Оценено)."
Степень риска: Неактивированная авторизация для команд клиента Docker может привести к возможности выполнения несанкционированных операций или изменений в контейнерах. Это создает риск для безопасности и целостности контейнерной среды.
Как исправить:
- Настройка авторизации: Включите и настройте механизм авторизации для команд клиента Docker, чтобы контролировать доступ и операции.
- Использование ролевых прав: Работайте с ролевыми правами и доступом, чтобы определить, какие пользователи или группы могут выполнять определенные операции.
2.13 - Ensure centralized and remote logging is configured (Scored) - "Убедитесь, что настроено централизованное и удаленное журналирование (Оценено)."
Степень риска: Отсутствие настроенного централизованного и удаленного журналирования может затруднить обнаружение и реакцию на события безопасности или проблемы в контейнерной среде. Это также усложняет мониторинг и анализ действий в контейнерах.
Как исправить:
- Конфигурация журналирования: Настройте систему централизованного и удаленного журналирования, чтобы записывать и анализировать логи событий в контейнерах.
- Резервное копирование логов: Убедитесь, что система журналирования настроена на регулярное резервное копирование логов для сохранения целостности данных.
2.14 - Ensure containers are restricted from acquiring new privileges (Scored) - "Убедитесь, что контейнерам запрещено приобретать новые привилегии (Оценено)."
Степень риска: Если контейнерам разрешено приобретать новые привилегии, это может увеличить уязвимости и повысить риск атак на вашу контейнерную среду. Неправильная конфигурация привилегий может привести к расширенным возможностям атаки и компрометации безопасности.
Как исправить:
- Ограничение привилегий: Настройте контейнеры таким образом, чтобы они не могли приобретать новые привилегии во время выполнения.
- Использование SELinux или AppArmor: Рассмотрите использование инструментов обязательного доступа, таких как SELinux или AppArmor, для управления привилегиями контейнеров.
2.15 - Ensure live restore is enabled (Scored) - "Убедитесь, что включена возможность восстановления контейнеров в реальном времени (Оценено)."
Степень риска: Отсутствие включенной опции восстановления контейнеров в реальном времени (live restore) может привести к потере данных в случае сбоя или перезапуска Docker демона во время работы контейнеров. Это может вызвать проблемы с непрерывностью работы и потерю состояния приложений.
Как исправить: Включение live restore: Убедитесь, что опция восстановления контейнеров в реальном времени включена в конфигурации Docker.
2.16 - Ensure Userland Proxy is Disabled (Scored) - "Убедитесь, что Userland Proxy отключен (Оценено)."
Степень риска: Включенный Userland Proxy может стать потенциальной точкой уязвимости и увеличить атаку на контейнеры, так как он делегирует сетевую обработку от ядра операционной системы к пользовательскому пространству, что может стать зоной риска.
Как исправить:
- Отключение Userland Proxy: Убедитесь, что Userland Proxy отключен в настройках Docker для улучшения производительности и безопасности.
- Использование режима проксирования: Рассмотрите использование других режимов проксирования (например, iptables) для обеспечения эффективного и безопасного сетевого взаимодействия.
3.15 - Ensure that the Docker socket file ownership is set to root:docker (Automated) - "Убедитесь, что владелец файла сокета Docker установлен на root:docker (Автоматизировано)."
Степень риска: Неправильные права доступа к файлу сокета Docker (/var/run/docker.sock) могут повлечь за собой уязвимости и потенциальные атаки на систему через Docker API. Необходимо исправить владельца файла для обеспечения безопасности.
Как исправить:
- Изменение владельца файла сокета: Выполните команду chown root:docker /var/run/docker.sock для установки правильных прав доступа к файлу сокета Docker.
- Перезапуск Docker сервиса: После изменения прав на файл сокета, перезапустите сервис Docker, чтобы применить изменения.
3.16 - Ensure that the Docker socket file permissions are set to 660 or more restrictively (Automated) - "Убедитесь, что права доступа к файлу сокета Docker установлены на 660 или более строго (Автоматизировано)."
Степень риска: Неправильные права доступа к файлу сокета Docker (/var/run/docker.sock) могут привести к раскрытию конфиденциальной информации, возможности атаки на Docker API и другим безопасностным угрозам. Необходимо скорректировать права доступа к файлу сокета для повышения безопасности.
Как исправить:
- Изменение прав доступа к файлу сокета: Выполните команду chmod 660 /var/run/docker.sock для установки правильных прав доступа к файлу сокета Docker.
- Проверка и обновление: Проверьте другие файлы и каталоги на соответствие правилам безопасности и исправьте их при необходимости.
4.1 - Ensure that a user for the container has been created (Automated) - "Убедитесь, что пользователь для контейнера был создан (Автоматизировано)."
Степень риска: Использование контейнеров с запущенными процессами от имени пользователя root увеличивает риск возможной компрометации контейнера и всей среды. Запуск процессов от имени привилегированного пользователя может привести к безопасностным уязвимостям и атакам.
Как исправить:
- Создание пользователей: Создайте отдельных пользователей в контейнерах для запуска процессов с минимальными привилегиями.
- Правила запуска: Установите правило запуска контейнеров от имени созданных пользователей, а не от имени root.
4.5 - Ensure Content trust for Docker is Enabled (Automated) - "Убедитесь, что доверие к содержимому для Docker включено (Автоматизировано)."
Степень риска: Отсутствие включенного доверия к содержимому (Content trust) для Docker может привести к возможным атакам с использованием вредоносных образов контейнеров, изменениям в безопасности и целостности сети Docker.
Как исправить:
- Включение Content trust: Убедитесь, что доверие к содержимому активировано для подписи и проверки образов перед их запуском.
- Управление ключами и подписями: Настройте процесс работы с ключами и подписями для обеспечения безопасности контейнеров и образов Docker.
5.2 - Ensure that, if applicable, an AppArmor Profile is enabled (Automated) - "Убедитесь, что, если это применимо, профиль AppArmor включен (Автоматизировано)."
Степень риска: Отсутствие активированного профиля AppArmor для контейнеров (в данном случае для сервера и PostgreSQL) может повлиять на безопасность контейнеров, поскольку AppArmor позволяет управлять доступом и поведением контейнеров в системе.
Как исправить:
- Создание и применение профиля: Настройте и примените профили AppArmor для контейнеров, чтобы установить правила безопасности и ограничения их действий.
- Тестирование и адаптация: Проведите тестирование профилей AppArmor для обеспечения корректной работы контейнеров и отсутствия нежелательных блокировок.
5.3 - Ensure that, if applicable, SELinux security options are set (Automated) - "Убедитесь, что, если это применимо, установлены параметры безопасности SELinux (Автоматизировано)."
Степень риска: Отсутствие установленных параметров безопасности SELinux для контейнеров (в данном случае для сервера и PostgreSQL) может повлиять на безопасность контейнеров, поскольку SELinux предоставляет механизмы обеспечения безопасности на уровне ядра Linux.
Как исправить:
- Установка параметров SELinux: Настройте и примените соответствующие параметры безопасности SELinux для контейнеров для усиления защиты и контроля доступа.
- Тестирование и проверка: Проведите проверки и тестирование параметров SELinux для обеспечения их правильной работы без сбоев.
5.8 - Ensure privileged ports are not mapped within containers (Automated) - "Убедитесь, что привилегированные порты не мапятся внутри контейнеров (Автоматизировано)."
Степень риска: Использование привилегированных портов в контейнерах (например, порт 80) может увеличить риск безопасности, поскольку это дает контейнеру более широкие права доступа, чем требуется, что потенциально может привести к уязвимостям и атакам.
Как исправить:
- Изменение портов: Измените использование привилегированных портов на непривилегированные для контейнеров, если это возможно.
- Использование нестандартных портов: Переназначьте приложения на нестандартные порты (>1024), оставляя привилегированные порты для обратного прокси или балансировщика нагрузки.
5.11 - Ensure that the memory usage for containers is limited (Automated) - "Убедитесь, что для контейнеров установлено ограничение на использование памяти (Автоматизировано)."
Степень риска: Запуск контейнеров без установленного ограничения на использование памяти может привести к излишнему расходу ресурсов, конфликтам и нестабильности системы. Это также может привести к перегрузке системы и падениям контейнеров.
Как исправить:
- Установка ограничений памяти: Укажите максимальное использование памяти для контейнеров с помощью параметров --memory или --memory-swap при запуске контейнера.
- Мониторинг использования ресурсов: Следите за использованием памяти контейнеров и подстраивайте установленные ограничения в соответствии с потребностями приложения.
5.12 - Ensure that CPU priority is set appropriately on containers (Automated) - "Убедитесь, что приоритет ЦПУ на контейнерах установлен соответствующим образом (Автоматизировано)."
Степень риска: Запуск контейнеров без установленного приоритета CPU (ограничений) может привести к нежелательной конкуренции за ресурсы процессора, перегрузке сервера и нестабильной работе приложений. Это также может привести к непредвиденным простоям или сбоям в работе контейнеров.
Как исправить:
- Установка ограничений CPU: Укажите максимальное содержание CPU на контейнер с помощью параметров --cpus при запуске контейнера.
- Мониторинг использования ресурсов: Проводите мониторинг использования CPU контейнерами и приспосабливайте установленные ограничения в соответствии с требованиями приложений.
5.13 - Ensure that the container's root filesystem is mounted as read only (Automated) - "Убедитесь, что корневая файловая система контейнера смонтирована только для чтения (Автоматизировано)."
Степень риска: Запуск контейнера с корневой файловой системой, смонтированной для чтения и записи, увеличивает риск изменения или повреждения системных файлов, что может привести к утечке информации и нарушению работоспособности приложений.
Как исправить:
- Настройка корневой файловой системы: Установите режим только для чтения для корневой файловой системы контейнера.
- Использование volume mounts: Используйте volume mounts для сохранения данных, а не изменения корневой файловой системы контейнера.
5.14 - Ensure that incoming container traffic is bound to a specific host interface (Automated) - "Убедитесь, что входящий сетевой трафик контейнера привязан к конкретному сетевому интерфейсу хоста (Автоматизировано)."
Степень риска: Привязка портов контейнера к широко используемому IP-адресу (0.0.0.0) может увеличить риск нарушений безопасности и расширить поверхность атак, из-за возможности обращения к портам с любого IP-адреса.
Как исправить:
- Ограничение привязки портов: Привяжите входящий сетевой трафик контейнера к конкретному IP-адресу хоста, а не к 0.0.0.0, чтобы уменьшить уязвимости.
- Использование брандмауэра: Настройте брандмауэр, чтобы допускать трафик только через необходимые порты и IP-адреса для улучшения безопасности.
5.26 - Ensure that the container is restricted from acquiring additional privileges (Automated) - "Убедитесь, что контейнер ограничен в приобретении дополнительных привилегий (Автоматизировано)."
Степень риска: Если контейнерам разрешено приобретать дополнительные привилегии, это может стать потенциальной точкой входа для злоумышленников, увеличив риск нежелательной доступности и контроля над системой.
Как исправить:
- Установка ограничений привилегий: Убедитесь, что у контейнера установлены ограничения привилегий, чтобы ограничить его возможности приобретения дополнительных привилегий.
- Мониторинг безопасности: Регулярно мониторьте привилегии контейнера и реагируйте на любые попытки приобретения нежелательных привилегий.
5.29 - Ensure that the PIDs cgroup limit is used (Automated) - "Убедитесь, что установлено ограничение на количество процессов (PIDs cgroup limit) (Автоматизировано)."
Степень риска: Отсутствие установленного ограничения на количество процессов (PIDs) в контейнерах (например, для сервера и PostgreSQL) может привести к перегрузке системы, утечкам ресурсов и возможным атакам на отказ в обслуживании.
Как исправить:
- Установка лимита PIDs: Укажите максимальное количество процессов, которые может запускать контейнер, с помощью параметра --pids-limit при запуске контейнера.
- Мониторинг процессов: Отслеживайте количество процессов в контейнерах и адаптируйте установленные лимиты в соответствии с потребностями приложений.
Проверим уязвимости с помощью docker-scout. Для этого выберем образ и выполним анализ В результате будут обнаружены те же самые уязвимости, что выявила утилита trivy